Thread(스레드) 동기화와 세마포어(Semaphore)
Critical Section(임계 구역)에 대한 접근을 막기 위해서 Locking 메커니즘이 필요하다.Mutex(binary semaphore)
임계구역에 하나의 스레드만 들어갈 수 있다.
Semaphor
임계구역에 여러 스레드가 들어갈 수 있다.
counter를 두어서 동시에 리소스에 접근 할 수 있는 허용 가능한 스레드 수를 제어
세마포어(Semaphore) with pseudo code — 함수로 구현되어 있음P: 검사(임계 영역에 들어갈 떄)
S값이 1이상이면, 임계 영역 진입 후, S값 1차감(S값이 0이면 대기)
V: 증가(임계 영역에서 나올 때)
S값을 1더하고, 임계 영역을 나옴
S: 세마포어 값(초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능)
pseudo code
P(S): wait(S){ //similar with lock.acquire()
while S<=0 //대기
;
S--; //다른 프로세스 접근 제한
}
V(S): signal(S) { //similar with lock.release()
S++; //다른 프로세스 접근 허용
}
세마포어(Semaphore)-바쁜 대기wait()은 S가 0이 아니라면, 임계 영역에 들어가기 위해, 반복문 수행
바쁜 대기, busy waiting -> CPU loop로 인해 성능 저하
세마포어(Semaphore)-대기큐S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣는다.
wait(S){
S->count--;
if(S->count<=0){
add this process to S->queue;
block() //ex) sleep()
}
}
signal(S){
S->count++;
if(S->count<=1){
remove a process P from S->queue;
wakeup(P);
}
}
주요 세마포어 함수(POSIX 세마포어)-Linuxsem_open(): 세마포어 생성
sem_wait(): 임계영역 접근 전, 세마포어를 잠그고, 세마포어가 잠겨있다면, 풀릴때 까지 대기(P)
sem_post(): 공유 자원에 대한 접근이 끝날을 때, 세마포어 잠금을 해제(